import { message } from '@/components/XtxUI'
import { useMemberStore } from '@/store'
import axios, { type Method } from 'axios'
import { storeToRefs } from 'pinia'

export const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net/'

const service = axios.create({
  baseURL: baseURL,
  timeout: 50000
})

// 添加请求拦截器
service.interceptors.request.use(
  function (config) {
    const memberStore = useMemberStore()
    const { profile } = storeToRefs(memberStore)
    if (profile.value?.token) {
      const { token } = profile.value
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  function (error) {
    return Promise.reject(error)
  }
)

// 添加响应拦截器
service.interceptors.response.use(
  function (response) {
    // 2xx范围内的状态码都会触发该函数
    return response
  },
  function (error) {
    // 超出2xx范围的状态码都会触发该函数
    if (error.code === 'ERR_NETWORK') {
      // 无网络错误提示
      message({ type: 'error', text: '网络错误，请换个网络环境' })
    } else {
      // 通用错误提示
      message({ type: 'error', text: error.response.data.message })
    }
    // 控制台显示错误
    return Promise.reject(error)
  }
)

/**
 * axios二次封装，整合TS类型
 * @param {Method} method  请求类型
 * @param {String} url  请求地址
 * @param {Object} data  可选值，提交数据
 */
// 后端返回的接口数据格式
interface ResponseData<T> {
  code: string
  msg: string
  result: T
}
export const http = <T>(method: Method, url: string, data?: object) =>
  service.request<ResponseData<T>>({
    method,
    url,
    // 自动设置合适的params/data键名称，如果method为get用params传请求参数，否则用data
    [method.toUpperCase() === 'GET' ? 'params' : 'data']: data
  })

export default service
